From c42684cca9d9035c444312fef220826fa48fc1d7 Mon Sep 17 00:00:00 2001 From: umherirrender Date: Fri, 6 Dec 2013 18:12:24 +0100 Subject: [PATCH] Make a single colon an invalid title in php and js When secureAndSplit gets a single colon as input, the leading colon is stripped and produces a title with a empty string. This change makes that impossible by moving the empty string check to after the substring removal of the colon. Bug: 54044 Change-Id: I574168c9ed281c535901c36dea7c179a4e794d20 --- includes/Title.php | 10 +++++----- resources/mediawiki/mediawiki.Title.js | 10 +++++----- tests/phpunit/includes/TitleTest.php | 1 + .../suites/resources/mediawiki/mediawiki.Title.test.js | 1 + 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/includes/Title.php b/includes/Title.php index 820842f5b9..a949ac301b 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -3163,10 +3163,6 @@ class Title { $dbkey = preg_replace( '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u', '_', $dbkey ); $dbkey = trim( $dbkey, '_' ); - if ( $dbkey == '' ) { - return false; - } - if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) { # Contained illegal UTF-8 sequences or forbidden Unicode chars. return false; @@ -3176,12 +3172,16 @@ class Title { # Initial colon indicates main namespace rather than specified default # but should not create invalid {ns,title} pairs such as {0,Project:Foo} - if ( ':' == $dbkey[0] ) { + if ( $dbkey !== '' && ':' == $dbkey[0] ) { $this->mNamespace = NS_MAIN; $dbkey = substr( $dbkey, 1 ); # remove the colon but continue processing $dbkey = trim( $dbkey, '_' ); # remove any subsequent whitespace } + if ( $dbkey == '' ) { + return false; + } + # Namespace or interwiki prefix $firstPass = true; $prefixRegexp = "/^(.+?)_*:_*(.*)$/S"; diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js index de2d0130da..51770fd6d8 100644 --- a/resources/mediawiki/mediawiki.Title.js +++ b/resources/mediawiki/mediawiki.Title.js @@ -126,12 +126,8 @@ // Trim underscores .replace( rUnderscoreTrim, '' ); - if ( title === '' ) { - return false; - } - // Process initial colon - if ( title.charAt( 0 ) === ':' ) { + if ( title !== '' && title.charAt( 0 ) === ':' ) { // Initial colon means main namespace instead of specified default namespace = NS_MAIN; title = title @@ -141,6 +137,10 @@ .replace( rUnderscoreTrim, '' ); } + if ( title === '' ) { + return false; + } + // Process namespace prefix (if any) m = title.match( rSplit ); if ( m ) { diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php index 6bfe545301..58f01460a7 100644 --- a/tests/phpunit/includes/TitleTest.php +++ b/tests/phpunit/includes/TitleTest.php @@ -66,6 +66,7 @@ class TitleTest extends MediaWikiTestCase { // Invalid foreach ( array( '', + ':', '__ __', ' __ ', // Bad characters forbidden regardless of wgLegalTitleChars diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js index cb0bf6936c..4083564e88 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js @@ -80,6 +80,7 @@ ], invalid: [ '', + ':', '__ __', ' __ ', // Bad characters forbidden regardless of wgLegalTitleChars -- 2.20.1